package model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import referential.Position;
import referential.TypeEuropeen;
import referential.TypeOrignalité;

public class Groupe extends CheckPoint {

  private String groupe;
  private Integer capacite;
  private List<CheckPoint> liste;
  private int groupId;
  
  public Groupe(String groupe, int groupId) {
    this.capacite = 0;
    this.groupId = groupId;
    this.groupe = groupe;
    this.liste = new ArrayList<CheckPoint>();
    super.listPassage = new ArrayList<List<Itineraire>>();
    for (int i = 0; i < NB_CHECK_POINT_PAR_ITINERAIRE; i++) {
      super.listPassage.add(new ArrayList<Itineraire>());
    }
  }
  
  
  public void ajouterCheckPoint (CheckPoint c) {
    setCapacite(getCapacite()+c.getAbsorption());
    liste.add(c);
  }
  
  public CheckPoint firstCheckPoint() {
    return liste.get(0);
  }


  public int getGroupId() {
    return groupId;
  }


  public void setGroupId(int groupId) {
    this.groupId = groupId;
  }


  public String getGroupe() {
    return groupe;
  }


  public void setGroupe(String groupe) {
    this.groupe = groupe;
  }


  public Integer getCapacite() {
    return capacite;
  }


  public void setCapacite(Integer capacite) {
    this.capacite = capacite;
  }


  public List<CheckPoint> getListe() {
    return liste;
  }


  public void setListe(List<CheckPoint> liste) {
    this.liste = liste;
  }

  

  @Override
  public Integer getId() {
    return getGroupId();
  }


  @Override
  public boolean estUneActiviteLongue() {
    return firstCheckPoint().estUneActiviteLongue();
  }


  @Override
  public boolean estUneActivitéOriginal() {
    return firstCheckPoint().estUneActivitéOriginal();
  }


  @Override
  public boolean estUneActivitéEuropeene() {
    return firstCheckPoint().estUneActivitéEuropeene();
  }




  @Override
  public void ajouterPassage(Itineraire itineraire) {
    super.ajouterPassage(itineraire);
  }


  @Override
  public boolean respecteLesQuotas(int i) {
    return super.respecteLesQuotas(i);
  }


  @Override
  public void retirerPassage(Itineraire itineraire, int etape) {
    // TODO Auto-generated method stub
    super.retirerPassage(itineraire, etape);
  }


  @Override
  public List<List<Itineraire>> getListPassage() {
    // TODO Auto-generated method stub
    return super.getListPassage();
  }


  @Override
  public String toCSV() {
    // TODO Auto-generated method stub
    return super.toCSV();
  }

  public String printReporting() {
    StringBuffer resultat = new StringBuffer();
    resultat.append("GROUPE : ").append(getGroupId()).append(" / ").append(getId()).append(" / ").append(getTitreActivité()).append(CSV_LINE_DELIMITER);
    
    for (Iterator<CheckPoint> itList = getListe().iterator(); itList.hasNext();) {
      CheckPoint c = itList.next();
      int numPassage = 1;
      resultat.append(c.getId()).append(" - ").append(getTitreActivité()).append(CSV_CELL_DELIMITER);
      for (Iterator<List<Itineraire>> itList2 = c.getListPassage().iterator(); itList2.hasNext();) {
        List<Itineraire> listItineraire = itList2.next();
        resultat.append("Passage ").append(numPassage++).append(CSV_CELL_DELIMITER).append(listItineraire.size()).append(CSV_CELL_DELIMITER);
      }
      resultat.append(CSV_LINE_DELIMITER);
    }
    resultat.append(CSV_LINE_DELIMITER);
    return resultat.toString();
  }



  @Override
  public String getTitreActivité() {
    return firstCheckPoint().getTitreActivité();
  }

  @Override
  public int getNombreEquipe() {
    return firstCheckPoint().getNombreEquipe();
  }


  @Override
  public int getAbsorption() {
    return capacite;
  }


  @Override
  public Position getPosition() {
    // TODO Auto-generated method stub
    return firstCheckPoint().getPosition();
  }


  @Override
  public int getDurée() {
    return firstCheckPoint().getDurée();
  }



  @Override
  public TypeOrignalité getOriginalité() {
    return firstCheckPoint().getOriginalité();
  }



  @Override
  public boolean isObligatoire() {
    return firstCheckPoint().isObligatoire();
  }



  @Override
  public boolean isRegionnal() {
    return firstCheckPoint().isRegionnal();
  }




  @Override
  public TypeEuropeen getEuropeen() {
    return firstCheckPoint().getEuropeen();
  }


  @Override
  public boolean isInteraction() {
    return firstCheckPoint().isInteraction();
  }



  @Override
  public boolean isVivreEnsemble() {
    return firstCheckPoint().isVivreEnsemble();
  }


  @Override
  public boolean isCreatif() {
    return firstCheckPoint().isCreatif();
  }

  @Override
  public boolean isIntellectuel() {
    return firstCheckPoint().isIntellectuel();
  }


  @Override
  public boolean isPhysique() {
    return firstCheckPoint().isPhysique();
  }


  @Override
  public boolean isTheatre() {
    return firstCheckPoint().isTheatre();
  }



  @Override
  public boolean isStimulante() {
    return firstCheckPoint().isStimulante();
  }


  @Override
  public boolean isFierte() {
    return firstCheckPoint().isFierte();
  }

  @Override
  public boolean isFunitude() {
    return firstCheckPoint().isFunitude();
  }

  @Override
  public boolean isConfrontation() {
    return firstCheckPoint().isConfrontation();
  }

  @Override
  public boolean isMobilisation() {
    return firstCheckPoint().isMobilisation();
  }

  @Override
  public boolean isProximite() {
    return firstCheckPoint().isProximite();
  }



  @Override
  public boolean isInstitution() {
    return firstCheckPoint().isInstitution();
  }



  @Override
  public boolean isKehl() {
    return firstCheckPoint().isKehl();
  }

  @Override
  public String getName() {
    return super.getName();
  }


  @Override
  public void setName(String name) {
    super.setName(name);
  }
  
  public boolean isGroupe() {
    return true;
  }
  
  public CheckPoint affecterACheckPoint(Itineraire i, int position) {
    for (Iterator<CheckPoint> it = liste.iterator();it.hasNext();) {
      CheckPoint c = it.next();
      if (c.respecteLesQuotasPlus1(position)) {
        c.ajouterPassage(i, position);
        return c;
      }
    }
    return null;
  }
  
}
